from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_jwt_extended import JWTManager

# (通过使用 flask-login 进行会话管理的相关操作，并完成用户合法性登陆和退出。)
# 初始化LoginManager
login_manager = LoginManager()
# 登录会话的一个安全检查,级别设置最高
login_manager.session_protection = 'strong'
# 设置login的视图login_view
login_manager.login_view = 'users.login'


# 创建数据库连接
db = SQLAlchemy()

# 生成jwt-manager
jwt_manager = JWTManager()


# 使用工厂方法创建app对象,方便传不同的参数
def create_app(config=None):
    # Flask类只有一个必须指定的参数，即程序主模块或者包的名字，__name__是系统变量，该变量指的是本py文件的文件名"""
    app = Flask(__name__)

    if config is not None:
        # 将配置信息加载到app对象中
        app.config.from_object(config)

    # 注册蓝图
    # (每个应用下面必须注册蓝图,相当于注册视图函数和应用的url)
    from application.common.error_handlers import error
    from application.home.views import home
    from application.users.views import users
    from application.api.users_api import users_api

    app.register_blueprint(error, url_prefix='/error')

    app.register_blueprint(home, url_prefix='/index')
    app.register_blueprint(users, url_prefix='/users')
    app.register_blueprint(users_api, url_prefix='/api/users')

    # 将数据库对象和app对象关联
    db.init_app(app)
    # LoginManager和与app关联
    login_manager.init_app(app)

    # jwt与app关联
    jwt_manager.init_app(app)
    return app
